package es.deusto.herotactics;

import java.io.File;
import java.io.FileFilter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;

import jugador.Jugador;
import logica.ModeloHT;
import logica.Partida;
import mapa.Coordenada;
import mapa.Mapa;

import organizacion.Equipo;

import razas.Raza;
import unidades.Unidad;
import unidades.UnidadHT;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import com.herotactics.fuentedatos.FuenteDatos;

import es.deusto.herotactics.database.FuenteDatosSQLite;
import es.deusto.herotactics.ingameandroid.Contexto;
import es.deusto.herotactics.ingameandroid.PantallaAndroid;
import es.deusto.herotactics.utils.Game;
import es.deusto.herotactics.utils.InGameState;
import es.deusto.herotactics.views.CoordImageView;

/**
 * Activity para crear/cargar las partidas y mostrar el juego en sí: el mapa con
 * la partida, menús y barra
 * 
 * @author Ibai
 *
 */
public class InGame extends Activity {
	private InGameState state = null;

	private Jugador[] jugadores;
//	private int[] colores = new int[MAX_JUGADORES];
	private int numeroJugador = 1;
	private UnidadHT currentUnit;
	private int currentPos;
	private String nombreRaza = "";
	private CoordImageView ultimoCIV;

	private OnClickListener anyadirListener;
	private OnClickListener crearListener;
	private OnClickListener addUnitListener;
	private OnClickListener removeUnitListener;
	private OnClickListener addLeaderListener;
	private OnClickListener unitSelectedListener;

	private TextView titulo;
	private ListView lista;
	private TextView tCreditos;

	private ArrayList<UnidadHT> units;
	private int creditos;

	
	private final int civsX = 2;
	private final int civsY = 5;
	private CoordImageView[][] civs = new CoordImageView[civsX][civsY];
	private boolean[][] civsOcupadas = new boolean[civsX][civsY];

	private FuenteDatos fuenteDatos = new FuenteDatosSQLite();

	private ModeloHT modeloHT = null;
	private PantallaAndroid pantalla;

	private TextView fecha;
	private TextView mapaCargar;
	private TextView jugador1;
	private TextView jugador2;
	private TextView turno;
	private TextView puntosAccionRestantes;

	private Button bIniciar;

	private Partida partidaActual;
	private ArrayList<Partida> partidas;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		setContentView(R.layout.pantalla_inicial);
		
		Intent intent = getIntent();
		Bundle bundle = intent.getExtras();
		if (bundle.getBoolean("cargarPartida")) {
			state = InGameState.GAMES;
			try {
				loadRazas();
				vistaPartidas();
			} catch (Exception e) {
				e.printStackTrace();
				Toast.makeText(this, "Error en la lectura de las partidas guardadas", Toast.LENGTH_LONG).show();
				this.finish();
			}
		} else {
			String[] nomJugadores = bundle.getStringArray("jugadores");
			final int maxJugadores = nomJugadores.length;
			jugadores = new Jugador[maxJugadores];
			for (int i=0; i<maxJugadores; i++) {
				jugadores[i] = new Jugador(nomJugadores[i]);
			}
			anyadirListener = new OnClickListener() {
				@Override
				public void onClick(View v) {
					vistaUnidades();
				}
			};
			crearListener = new OnClickListener() {
				@Override
				public void onClick(View v) {
					if (numeroJugador >= maxJugadores) {
						vistaMapas();
					} else {
						numeroJugador++;
						crearEquipos();
					}
				}
			};
			addUnitListener = new OnClickListener() {
				@Override
				public void onClick(View v) {
					anyadirUnidad();
					vistaEquipo();
				}
			};
			removeUnitListener = new OnClickListener() {
				@Override
				public void onClick(View v) {
					quitarUnidad();
					vistaEquipo();
				}
			};
			addLeaderListener = new OnClickListener() {
				@Override
				public void onClick(View v) {
					if (anyadirUnidad())
						vistaEquipo();
				}
			};
			unitSelectedListener = new OnClickListener() {
				@Override
				public void onClick(View v) {
					determinarPosicionSeleccionada((CoordImageView)v);
					dibujarPosiciones();
				}
			};
			crearEquipos();
		}

	}
	/** Anula la pulsación de las teclas menu y atrás */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		return false;
	}

	/** Gestiona la pulsación de las teclas atrás y menú para mostrar/ocultar los
	 * menús de la partida y navegar entre los diferentes menús o lanzar el activity
	 * del nivel superior */
	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event)
	{
		if (state == InGameState.INGAME && keyCode == KeyEvent.KEYCODE_MENU)
		{
			Contexto contexto = pantalla.getContexto();
			if (contexto.getActivo())
				contexto.destruir();
			else
				Game.menuPartida(pantalla);
			pantalla.refrescarPantalla();
		} else if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (state == InGameState.INGAME) {
				Contexto contexto = pantalla.getContexto();
				if (contexto.getActivo()) {
					contexto.destruir();
					pantalla.refrescarPantalla();
				} else if( pantalla.getCurrentAction(true) != null) {
					pantalla.getCurrentAction(false).cancel();
					pantalla.refrescarPantalla();
				} else
					Game.salir(pantalla);
			} else if (state == InGameState.UNITINTEAM) {
				vistaEquipo();
			} else if (state == InGameState.UNITINUNITS) {
				if (ultimoCIV != null) {
					Coordenada coord = ultimoCIV.getCoordenada();
					civsOcupadas[coord.getX()][coord.getY()] = false;
				}
				vistaUnidades();
			} else if (state == InGameState.UNITS) {
				vistaEquipo();
			} else if (state == InGameState.TEAM) {
				vistaLideres();
			} else if (state == InGameState.LEADERS) {
				nombreRaza = "";
				crearEquipos();
			} else if (state == InGameState.RAZA) {
				cancelarCreacion();
			} else if (state == InGameState.LEADER) {
				vistaLideres();
			} else if (state == InGameState.GAME) {
				try {
					vistaPartidas();
				} catch (Exception e) {
					//nunca debería llegar aquí
					e.printStackTrace();
				}
			} else if (state == InGameState.GAMES) {
				this.finish();
			}
		}
		return false;
	}

	/**
	 * Método que muestra una lista de las razas disponibles para que el jugador elija la
	 * la que quiere usar
	 */
	private void crearEquipos() {
		state = InGameState.RAZA;
		setContentView(R.layout.list_view);
		titulo = (TextView) findViewById(R.id.titulo);
		lista = (ListView) findViewById(R.id.lista);
		titulo.setText("Raza de "+jugadores[numeroJugador-1].getNombre());
		LinearLayout barraInferior = (LinearLayout) findViewById(R.id.barra_inferior);
		barraInferior.setVisibility(View.GONE);
		lista.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, loadRazas()));
		lista.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				nombreRaza = (String) ((TextView) arg1).getText();
//				if (nombreRaza.equals("Kralean")) {
//					colores[numeroJugador-1] = Color.RED;
//				} else if (nombreRaza.equals("Gerhan")) { 
//					colores[numeroJugador-1] = Color.BLUE;
//				}
				vistaLideres();
			}
		});
		for (int i=0; i<civsX; i++) {
			for (int j=0; j<civsY; j++) {
				civsOcupadas[i][j] = false;
			}
		}
		jugadores[numeroJugador-1].getEquipo().clear();
		creditos = 1500;
		TextView tCreditos = (TextView) findViewById(R.id.creditos);
		tCreditos.setText(Integer.toString(creditos));
	}

	/**
	 * Pantalla en la que se muestran los líderes de la raza del jugador activo
	 */
	private void vistaLideres() {
		state = InGameState.LEADERS;
		setContentView(R.layout.list_view);
		titulo = (TextView) findViewById(R.id.titulo);
		lista = (ListView) findViewById(R.id.lista);
		titulo.setText("Líderes");
		TextView tCreditos = (TextView) findViewById(R.id.creditos);
		tCreditos.setText(Integer.toString(creditos));
		LinearLayout barraInferior = (LinearLayout) findViewById(R.id.barra_inferior);
		barraInferior.setVisibility(View.GONE);
		lista.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, loadLeaders()));
		lista.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				vistaDetalle(units.get(arg2), arg2);
			}
		});
		quitarUnidadPos(0);
	}

	/**
	 * Pantalla en la que se muestran las unidades que tiene el equipo del jugador activo.
	 */
	private void vistaEquipo() {
		state = InGameState.TEAM;
		setContentView(R.layout.list_view);
		titulo = (TextView) findViewById(R.id.titulo);
		lista = (ListView) findViewById(R.id.lista);
		tCreditos = (TextView) findViewById(R.id.creditos);
		titulo.setText("Equipo "+numeroJugador);
		tCreditos.setText(Integer.toString(creditos));
		LinearLayout barraInferior = (LinearLayout) findViewById(R.id.barra_inferior);
		barraInferior.setVisibility(View.VISIBLE);
		Button botonAnyadir = (Button) findViewById(R.id.boton_inferior);
		botonAnyadir.setOnClickListener(anyadirListener);
		botonAnyadir.setText("Añadir unidad");
		Button botonCrear = (Button) findViewById(R.id.boton_crear);
		botonCrear.setOnClickListener(crearListener);
		lista.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, loadUnits(jugadores[numeroJugador-1].getEquipo())));
		lista.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				vistaDetalle(units.get(arg2), arg2);
			}
		});
	}

	/**
	 * Método que mete en el atributo units la lista de unidades del equipo o de unidades disponibles y
	 *  devuelve un array de Strings con los nombres de las unidades
	 * 
	 * @param team Es el equipo del que se quieren cargar las unidades, si es null, se cargarán
	 *  las disponibles
	 * @return Array con los nombres de las unidades disponbles
	 */
	private String[] loadUnits(Equipo team) {
		if (team == null) {
			units = Game.loadUnits(Game.pathAHT+"/Unidades/"+nombreRaza+"/UnitList");
		} else {
			units = new ArrayList<UnidadHT>();
			ArrayList<Unidad> unitsTemp = (ArrayList<Unidad>) team.getUnidades();
			for (Unidad unitTemp : unitsTemp) {
				units.add((UnidadHT) unitTemp);
			}
		}
		return volcarAStrings();
	}

	/**
	 * Método para cargar los líderes de la raza activa
	 * @return
	 */
	private String[] loadLeaders() {
		units = Game.loadUnits(Game.pathAHT+"/Unidades/"+nombreRaza+"/LeaderList");
		return volcarAStrings();
	}

	/**
	 * Carga las razas que hay en el sistema de carpetas e instancia el modelo de
	 * ejecución Hero Tactics con esas razas y la fuente de datos
	 * 
	 * @return Un array con los nombres de las razas
	 */
	private String[] loadRazas() {
		if (modeloHT == null) {
			HashMap<String, Raza> razas = new HashMap<String, Raza>();
			File carpeta = new File(Game.pathAHT+"/Unidades");
			File[] carpetasRazas = carpeta.listFiles(new FileFilter() {
				@Override
				public boolean accept(File pathname) {
					return pathname.isDirectory();
				}
			});
			for (File f : carpetasRazas) {
				String nombreRaza = f.getName();
				Raza raza = new Raza(nombreRaza);
				razas.put(nombreRaza, raza);
				String ruta = f.getAbsolutePath();
				raza.setLideres(Game.loadUnits(ruta+"/LeaderList"));
				raza.setUnidades(Game.loadUnits(ruta+"/UnitList"));
			}
			modeloHT = new ModeloHT(fuenteDatos, razas);
		}
		Collection<String> cRazas = Raza.getRazas();
		if (nombreRaza != null)
			cRazas.remove(nombreRaza);
		String[] nombres = new String[cRazas.size()];
		int i = 0;
		for (String s : cRazas) {
			nombres[i] = s;
			i++;
		}
		return nombres;
	}

	/**
	 * Vuelca la colección de unidades a un array con sus nombres
	 * 
	 * @return
	 */
	private String[] volcarAStrings() {
		String[] nombres = new String[units.size()];
		for (int i=0; i<nombres.length; i++)
			nombres[i] = units.get(i).getClass().getSimpleName();
		return nombres;
	}

	/**
	 * Muestra los detalles de la unidad y da a elegir la posición en la que se 
	 * quiere que salga en el mapa. Y según de donde se haya llamado dará opción
	 * de añadir o quitar del equipo
	 * 
	 * @param unit Unidad de la que se quieren mostrar los detalles
	 * @param pos Posición en la lista de donde se ha seleccionado la unidad
	 */
	private void vistaDetalle(UnidadHT unit, Integer pos) {
		currentPos = pos;
		currentUnit = unit;
		setContentView(R.layout.unit);
		TextView tCreditos = (TextView) findViewById(R.id.creditos_detalle);
		tCreditos.setText(Integer.toString(creditos));
		TableLayout posiciones = (TableLayout) findViewById(R.id.tabla_posicion);
		posiciones.setVisibility(View.VISIBLE);
		for (int i=0; i<civsX; i++) { 
			for (int j=0; j<civsY; j++) {
				CoordImageView civ =  new CoordImageView(this, new Coordenada(i,j));				
				civ.setOnClickListener(unitSelectedListener);
				civs[i][j] = civ;
			}
		}
		int i = 0;
		int j = 0;
		TableRow tableRow;
		for (int id : new int[] {R.id.tableRowX0,
				R.id.tableRowX1,
				R.id.tableRowX2,
				R.id.tableRowX3,
				R.id.tableRowX4 }) {
			i = 0;
			tableRow = (TableRow) findViewById(id);
			if (tableRow.getChildCount() == civsX) {
				civs[i][j] = (CoordImageView) tableRow.getChildAt(i);
				i++;
				civs[i][j] = (CoordImageView) tableRow.getChildAt(i);
				j++;
			} else {
				tableRow.addView(civs[i++][j], LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
				tableRow.addView(civs[i][j++], LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
			}
		}
		dibujarPosiciones();
		ultimoCIV = null;
		Button bInferior = (Button) findViewById(R.id.inferior_detail);
		LinearLayout barra = (LinearLayout) findViewById(R.id.layoutAnyadir);
		barra.setVisibility(View.VISIBLE);
		if (state == InGameState.LEADERS) {
			bInferior.setText("Añadir");
			bInferior.setOnClickListener(addLeaderListener);
			state = InGameState.LEADER;
//			Coordenada coord = currentUnit.getPosicion();
//			if (coord != null) {
//				ultimoCIV = civs[coord.getX()][coord.getY()];
//			}
		} else if(state == InGameState.UNITS) {
			bInferior.setText("Añadir");
			bInferior.setOnClickListener(addUnitListener);
			state = InGameState.UNITINUNITS;
		} else {
			if (pos == 0) {
				barra.setVisibility(View.GONE);
			} else {
				bInferior.setText("Quitar");
				bInferior.setOnClickListener(removeUnitListener);
			}
			Coordenada coord = currentUnit.getPosicion();
			if (coord != null) {
				ultimoCIV = civs[coord.getX()][coord.getY()];
			}
			state = InGameState.UNITINTEAM;
		}
		ImageView imagen = (ImageView) findViewById(R.id.imagen);
		imagen.setImageBitmap(BitmapFactory.decodeFile(Game.pathAHT+"/Unidades/"+unit.getId()+".png"));
		TextView textView = (TextView) findViewById(R.id.unidad);
		textView.setText(unit.getClass().getSimpleName());
		textView = (TextView) findViewById(R.id.vida);
		textView.setText(Integer.toString(unit.VIDA_MAX));
		textView = (TextView) findViewById(R.id.ataque);
		textView.setText(Integer.toString(unit.ATAQUE));
		textView = (TextView) findViewById(R.id.defensa);
		textView.setText(Integer.toString(unit.DEFENSA));
		textView = (TextView) findViewById(R.id.dist_ataq);
		textView.setText(unit.DIST_ATAQ_MIN+"-"+unit.DIST_ATAQ_MAX);
		textView = (TextView) findViewById(R.id.movilidad);
		textView.setText(Integer.toString(unit.MOVILIDAD));
		TableRow rowCoste = (TableRow) findViewById(R.id.row_coste);
		if (state == InGameState.LEADER) {
			rowCoste.setVisibility(View.GONE);
		} else {
			rowCoste.setVisibility(View.VISIBLE);
			textView = (TextView) findViewById(R.id.coste);
			textView.setText(Integer.toString(unit.getCoste()));
		}
	}

	/**
	 * Muestra todas las unidades disponibles de la raza activa
	 */
	private void vistaUnidades() {
		state = InGameState.UNITS;
		setContentView(R.layout.list_view);
		titulo = (TextView) findViewById(R.id.titulo);
		lista = (ListView) findViewById(R.id.lista);
		titulo.setText("Unidades");
		TextView tCreditos = (TextView) findViewById(R.id.creditos);
		tCreditos.setText(Integer.toString(creditos));
		LinearLayout barraInferior = (LinearLayout) findViewById(R.id.barra_inferior);
		barraInferior.setVisibility(View.GONE);
		lista.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, loadUnits(null)));
		lista.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				vistaDetalle(units.get(arg2), arg2);
			}
		});
	}

	/**
	 * Muestra una alerta informativa
	 * 
	 * @param texto Texto a mostrar en la alerta
	 */
	private void crearAlerta(String texto) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(texto)
		.setCancelable(false)
		.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int id) {
				dialog.cancel();
			}
		});
		AlertDialog alert = builder.create();
		alert.show();
	}

	/**
	 * Añade la unidad activa al equipo activo
	 * 
	 * @return Si añade la unidad al equipo o no
	 */
	private boolean anyadirUnidad() {
		if (currentUnit.getPosicion() == null) {
			crearAlerta("Hay que seleccionar una posición para poder añadir la unidad");
			return false;
		} else if(creditos < currentUnit.getCoste()) {
			Coordenada coord = currentUnit.getPosicion();
			civsOcupadas[coord.getX()][coord.getY()] = false;
			crearAlerta("Créditos insuficientes");
			return false;
		} else {
			ArrayList<Unidad> unidades = (ArrayList<Unidad>) jugadores[numeroJugador-1].getEquipo().getUnidades();
			if (state == InGameState.LEADER) {
				unidades.add(0,currentUnit);
			} else {
				creditos -= currentUnit.getCoste();
				unidades.add(currentUnit);
			}
			return true;
		}
	}

	/**
	 * Quita la unidad activa del equipo activo y lo borra de la lista
	 */
	private void quitarUnidad() {
		quitarUnidadPos(currentPos);
	}

	/**
	 * Quita la unidad activa del equipo activo y borra la posición indicada de la
	 * lista de unidades
	 * 
	 * @param pos Poscición de la lista en la que está la unidad
	 */
	private void quitarUnidadPos(int pos) {
		try {
			if (state != InGameState.LEADERS)
				creditos += currentUnit.getCoste();
			((ArrayList<Unidad>) jugadores[numeroJugador-1].getEquipo().getUnidades()).remove(currentPos);
			Coordenada coord = currentUnit.getPosicion();
			civsOcupadas[coord.getX()][coord.getY()] = false;
		} catch (Exception e) {
			//no hacer nada
		}
	}

	/**
	 * Carga la partida que se acaba de crear y se muestra el campo de juego
	 * 
	 * @param partida La partida creada durante este proceso
	 */
	private void loadGame(Partida partida) {
		state = InGameState.INGAME;
		modeloHT.setPartida(partida);
		pantalla = new PantallaAndroid(this, modeloHT);
		setContentView(pantalla);
	}

	/**
	 * Cancela la creación de la partida que se está creando
	 */
	private void cancelarCreacion() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage("¿Seguro que quieres cancelar la creación de una partida?")
		.setCancelable(true)
		.setPositiveButton("Si", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int id) {
				InGame.this.finish();
			}
		})
		.setNeutralButton("No", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int id) {
				dialog.cancel();
			}
		});
		AlertDialog alert = builder.create();
		alert.show();
	}

	/**
	 * Pantalla con la lista de los mapas disponibles
	 */
	private void vistaMapas() {
		state = InGameState.MAPS;
		setContentView(R.layout.list_view);
		titulo = (TextView) findViewById(R.id.titulo);
		titulo.setText("Mapas");
		ListView lista = (ListView) findViewById(R.id.lista);
		LinearLayout lL = (LinearLayout) findViewById(R.id.barra_inferior);
		lL.setVisibility(View.GONE);
		lL = (LinearLayout) findViewById(R.id.lCreditos);
		lL.setVisibility(View.GONE);
		Collection<String> cMapas =  Mapa.getMapas();
		String[] mapas = new String[cMapas.size()];
		int i = 0;
		for (String s : cMapas) {
			mapas[i] = s;
			i++;
		}
		lista.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mapas));
		// Creacion del Listener para los clicks
		lista.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View v, int position, long rowid) {
				String nombreMapa = (String) ((TextView) v).getText();
				loadGame(new Partida(jugadores[0], jugadores[1], Mapa.getMapa(nombreMapa)));
			}
		});
	}

	/**
	 * Dibuja una tabla en la que elegir la posición en la que se quiere que aparezca la
	 * unidad activa
	 */
	private void dibujarPosiciones() {
		CoordImageView coord;
		for(int i=0; i<civsX; i++){
			for(int j=0; j<civsY; j++){
				coord = (CoordImageView) civs[i][j];
				Coordenada pos = coord.getCoordenada();
				if (civsOcupadas[pos.getX()][pos.getY()]) {
					coord.setImageResource(R.drawable.cuadrado_rojo);
				}else{
					coord.setImageResource(R.drawable.cuadrado_blanco);
				}
			}
		}
		if (currentUnit != null) {
			Coordenada pos = currentUnit.getPosicion();
			if(pos != null){
				civs[pos.getX()][pos.getY()].setImageResource(R.drawable.cuadrado_verde);
			}
		}
	}

	/**
	 * Método que actualiza la tabla con las posiciones al cambiarla
	 * 
	 * @param coord Nueva posición seleccionada
	 */
	private void determinarPosicionSeleccionada(CoordImageView coord) {
		Coordenada pos = coord.getCoordenada();
		Coordenada posUlt;
		if (!civsOcupadas[pos.getX()][pos.getY()]) {
			if (ultimoCIV != null) {
				posUlt = ultimoCIV.getCoordenada();
				civsOcupadas[posUlt.getX()][posUlt.getY()] = false;
			}
			ultimoCIV = coord;
			currentUnit.setPosicion(coord.getCoordenada());
			civsOcupadas[pos.getX()][pos.getY()] = true;
		}
	}

	/**
	 * Coge las fechas de la lista de partidas
	 * 
	 * @param p lista de las partidas
	 * @param s lista de las fechas de las partidas
	 */
	public void cargarFechas(ArrayList<Partida> p, String[] s)
	{
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MMMM/yyyy hh:mm");
		int i=0;
		while (p!=null && i<p.size())
		{
			s[i] = sdf.format(new Date(p.get(i).getFecha()));
			i++;
		}
	}
	
	/**
	 * Pantalla que muestra las partidas disponibles para cargar
	 */
	private void vistaPartidas() throws Exception {
		ArrayAdapter<String> adapter;
		partidas = (ArrayList<Partida>) modeloHT.cargarPartidas();
		String[] fechasPartidas = new String[partidas.size()];
		cargarFechas(partidas, fechasPartidas);
		OnItemClickListener itemListener = new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				partidaActual = partidas.get(arg2);
				vistaPartida();
			}
		};
		ArrayList<String> list = new ArrayList<String>(Arrays.asList(fechasPartidas));
		if (list.isEmpty()) {
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setMessage("No hay partidas guardadas")
			.setCancelable(false)
			.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {
					dialog.cancel();
					InGame.this.finish();
				}
			});
			AlertDialog alert = builder.create();
			alert.show();
		} else {
			setContentView(R.layout.list_view);
			lista = (ListView) findViewById(R.id.lista);
			state = InGameState.GAMES;
			titulo = (TextView) findViewById(R.id.titulo);
			titulo.setText("Partidas");
			LinearLayout lL = (LinearLayout) findViewById(R.id.barra_inferior);
			lL.setVisibility(View.GONE);
			lL = (LinearLayout) findViewById(R.id.lCreditos);
			lL.setVisibility(View.GONE);
			adapter = new ArrayAdapter<String>(
					this, 
					R.layout.list_item,
					list);
			lista.setAdapter(adapter);
			lista.setOnItemClickListener(itemListener);
		}
	}

	/**
	 * Coge el nombre del mapa
	 * 
	 * @param idMapa mapa del que coger el nombre
	 * @return nombre del mapa
	 */
	private String getNombreMapa(int idMapa) {
		Collection<String> mapas = Mapa.getMapas();
		for(String s : mapas) {
			Mapa mapa = Mapa.getMapa(s);
			if(mapa.getIdMapa() == idMapa) {
				return s;
			}
		}
		throw new IllegalArgumentException("El mapa no existe");
	}
	
	/**
	 * Pantalla que muestra los detalles y carga la partida seleccionada. 
	 */
	private void vistaPartida() {
		state = InGameState.GAME;
		setContentView(R.layout.informacion_partida);
		
		fecha = (TextView) findViewById(R.id.fecha);
		mapaCargar = (TextView) findViewById(R.id.mapa);
		jugador1 = (TextView) findViewById(R.id.jugador1);
		jugador2 = (TextView) findViewById(R.id.jugador2);
		turno = (TextView) findViewById(R.id.turno);
		puntosAccionRestantes = (TextView) findViewById(R.id.puntosAccionRestantes);

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MMMM/yyyy hh:mm");
		
//		Date d = new Date(partidaActual.getFecha());
		fecha.setText("Fecha: " + sdf.format(new Date(partidaActual.getFecha())));
		mapaCargar.setText("Mapa: " + getNombreMapa(partidaActual.getMapa().getIdMapa()));
		jugador1.setText("Jugador 1: " + partidaActual.getJugadorA().getNombre());
		jugador2.setText("Jugador 2: " + partidaActual.getJugadorB().getNombre());
		turno.setText("Turno de: " + partidaActual.getTurno().getJugadorActivo().getNombre());
		puntosAccionRestantes.setText("Puntos de accion restantes: " + partidaActual.getTurno().getPuntosAccion());

		bIniciar = (Button) findViewById(R.id.boton_iniciar);

		bIniciar.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Mapa mapa = partidaActual.getMapa();
				Unidad[][] unidades = mapa.getUnidades();
				for (int i=0; i<unidades.length; i++) {
					for (int j=0; j<unidades[0].length; j++) {
						unidades[i][j] = null;
					}
				}
				Collection<Unidad> uds = partidaActual.getJugadorA().getEquipo().getUnidades();
				for (Unidad u : uds) {
					Coordenada coord = u.getPosicion();
					unidades[coord.getX()][coord.getY()] = u;
				}
				uds = partidaActual.getJugadorB().getEquipo().getUnidades();
				for (Unidad u : uds) {
					Coordenada coord = u.getPosicion();
					unidades[coord.getX()][coord.getY()] = u;
				}
				mapa.setUnidades(unidades);
				loadGame(partidaActual);
			}
		});
	}

}